
package org.yeyu.utils;

import javafx.application.Platform;
import javafx.collections.ObservableList;
import javafx.scene.control.Alert;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.stage.Window;
import javafx.scene.Node;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * UI相关工具类
 */
public class UIUtils {
    private static final Logger logger = LogManager.getLogger(UIUtils.class);
    private static final ExecutorService executorService = Executors.newFixedThreadPool(4);

    /**
     * 在后台线程中执行任务
     * @param runnable 要执行的任务
     */
    public static void runInBackground(Runnable runnable) {
        executorService.submit(() -> {
            try {
                runnable.run();
            } catch (Exception e) {
                logger.error("后台任务执行出错: {}", e.getMessage(), e);
            }
        });
    }

    /**
     * 在JavaFX主线程中执行任务
     * @param runnable 要执行的任务
     */
    public static void runOnJavaFXThread(Runnable runnable) {
        if (Platform.isFxApplicationThread()) {
            runnable.run();
        } else {
            Platform.runLater(runnable);
        }
    }

    /**
     * 显示提示信息
     * @param message 提示信息
     * @param ownerWindow 父窗口
     */
    public static void showAlert(String message, Window ownerWindow) {
        runOnJavaFXThread(() -> {
            Alert alert = new Alert(Alert.AlertType.INFORMATION);
            alert.setTitle("提示");
            alert.setHeaderText(null);
            alert.setContentText(message);

            if (ownerWindow != null) {
                alert.initOwner(ownerWindow);
            }

            alert.showAndWait();
        });
    }

    /**
     * 更新状态栏
     * @param statusLabel 状态标签
     * @param message 状态消息
     */
    public static void updateStatus(Label statusLabel, String message) {
        runOnJavaFXThread(() -> {
            statusLabel.setText(message);
            logger.info("状态更新: {}", message);
        });
    }

    /**
     * 显示或隐藏控件
     * @param node 控件
     * @param visible 是否可见
     */
    public static void setVisible(Node node, boolean visible) {
        runOnJavaFXThread(() -> node.setVisible(visible));
    }

    /**
     * 禁用或启用控件
     * @param node 控件
     * @param disabled 是否禁用
     */
    public static void setDisabled(Node node, boolean disabled) {
        runOnJavaFXThread(() -> node.setDisable(disabled));
    }

    /**
     * 刷新表格列
     * @param tableView 表格视图
     * @param results 搜索结果列表
     * @param sheetColumn 工作表列
     * @param rowColumn 行号列
     */
    public static <T> void refreshTableColumns(TableView<T> tableView, 
            List<T> results, TableColumn<T, String> sheetColumn, 
            TableColumn<T, Integer> rowColumn) {
        runOnJavaFXThread(() -> {
            ObservableList<TableColumn<T, ?>> columns = tableView.getColumns();
            columns.removeIf(col -> !col.equals(sheetColumn) && !col.equals(rowColumn));

            if (results.isEmpty()) return;

            // 这里需要根据具体类型处理，实际使用时可能需要调整
            // 例如，对于SearchResult类型，获取headers并创建列
            // 此处仅为示例代码
            /*
            if (results.get(0) instanceof SearchResult) {
                SearchResult searchResult = (SearchResult) results.get(0);
                List<String> headers = searchResult.getHeaders();
                for (int i = 0; i < headers.size(); i++) {
                    final int columnIndex = i;
                    TableColumn<T, String> column = new TableColumn<>(headers.get(i));
                    column.setCellValueFactory(cellData -> {
                        T result = cellData.getValue();
                        if (result instanceof SearchResult) {
                            SearchResult sr = (SearchResult) result;
                            if (sr.getRowData() != null && columnIndex < sr.getRowData().size()) {
                                return new javafx.beans.property.SimpleStringProperty(sr.getRowData().get(columnIndex));
                            }
                        }
                        return new javafx.beans.property.SimpleStringProperty("");
                    });

                    // 添加排序功能
                    column.setSortable(true);
                    column.setComparator((s1, s2) -> {
                        // 处理可能的空值
                        if (s1 == null && s2 == null) return 0;
                        if (s1 == null) return -1;
                        if (s2 == null) return 1;

                        // 尝试按数字排序，如果失败则按字符串排序
                        try {
                            double num1 = Double.parseDouble(s1);
                            double num2 = Double.parseDouble(s2);
                            return Double.compare(num1, num2);
                        } catch (NumberFormatException e) {
                            // 如果不是数字，则按字符串排序
                            return s1.compareTo(s2);
                        }
                    });

                    tableView.getColumns().add(column);
                }
            }
            */
        });
    }

    /**
     * 关闭线程池
     */
    public static void shutdown() {
        executorService.shutdown();
    }
}
